﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Collections;
using PlaylistGenEngine.VOs;

namespace PlaylistGenerator_v1._0
{
    public partial class FormGeraPlaylist : Form
    {

        #region Inicialização e Ajustes
        public FormGeraPlaylist()
        {
            InitializeComponent();
            listMusicas.DisplayMember = "nomeDaPasta";
            listComerciais.DisplayMember = "nomeDaPasta";
        }

        private void FormGeraPlaylist_FormClosed(object sender, FormClosedEventArgs e)
        {
            ((FormPrincipal)this.MdiParent).IsFormGeraAberto = false;
        }
        
        private void btnFechar_Click(object sender, EventArgs e)
        {
            this.Close();
        }
        #endregion


        #region Validadores Botões
        private void listMusicas_SelectedIndexChanged(object sender, EventArgs e)
        {
            habilitaBotoesManutencao(
                listMusicas, btnAlteraPastaMusica, btnExcluiPastaMusica,
                btnOrdenaMaisMusica, btnOrdenaMenosMusica);
        }

        private void listComerciais_SelectedIndexChanged(object sender, EventArgs e)
        {
            habilitaBotoesManutencao(
                listComerciais, btnAlteraPastaComercial, btnExcluiPastaComercial,
                btnOrdenaMaisComercial, btnOrdenaMenosComercial);
        }

        private void habilitaBotoesManutencao(ListBox list, params Button[] botoes)
        {
            Boolean habilita = list.SelectedIndex > -1;
            foreach (Button btn in botoes)
            {
                btn.Enabled = habilita;
            }
        }

        private void validaBotaoGeraPlaylist()
        {
            Boolean habilita = listMusicas.Items.Count > 0;
            btnGeraGrade.Enabled = habilita;
        }
        #endregion

        #region Inserção
        private void btnInserePastaMusica_Click(object sender, EventArgs e)
        {
            inserePasta(listMusicas, TipoPasta.MUSICA);
        }

        private void btnInserePastaComercial_Click(object sender, EventArgs e)
        {
            inserePasta(listComerciais, TipoPasta.COMERCIAL);
        }

        private void inserePasta(ListBox list, TipoPasta tipo)
        {
            folderBrowserDialog.ShowDialog();
            String path = folderBrowserDialog.SelectedPath;
            if (list.Items.Contains(path))
            {
                MessageBox.Show("A pasta \"" + path + "\" já existe na lista!");
            }
            else if (path.Length > 0)
            {
                Pasta pasta = new Pasta(path, tipo);
                list.Items.Add(pasta);
            }
            validaBotaoGeraPlaylist();
        }
        #endregion

        #region Alteração
        private void btnAlteraPastaMusica_Click(object sender, EventArgs e)
        {
            alteraPasta(listMusicas);
        }

        private void btnAlteraPastaComercial_Click(object sender, EventArgs e)
        {
            alteraPasta(listComerciais);
        }

        private void alteraPasta(ListBox list)
        {
            String path = ((Pasta)list.SelectedItem).FolderPath;
            folderBrowserDialog.SelectedPath = path;
            folderBrowserDialog.ShowDialog();
            path = folderBrowserDialog.SelectedPath;
            if (list.Items.Contains(path))
            {
                MessageBox.Show("A pasta \"" + path + "\" já existe na lista!");
            }
            else
            {
                int index = list.SelectedIndex;
                Pasta pasta = ((Pasta)list.Items[index]);
                list.Items.Remove(pasta);
                pasta.FolderPath = path;
                list.Items.Insert(index, pasta);
            }
            validaBotaoGeraPlaylist();
        }
        #endregion

        #region Exclusão
        private void btnExcluiPastaMusica_Click(object sender, EventArgs e)
        {
            excluiPasta(listMusicas);
        }

        private void btnExcluiPastaComercial_Click(object sender, EventArgs e)
        {
            excluiPasta(listComerciais);
        }

        private void excluiPasta(ListBox list)
        {
            list.Items.Remove(list.SelectedItem);
            validaBotaoGeraPlaylist();
        }
        #endregion

        #region Ordenação
        private void btnOrdenaMaisMusica_Click(object sender, EventArgs e)
        {
            ordenaItem(listMusicas, 'a', -1);
        }

        private void btnOrdenaMenosMusica_Click(object sender, EventArgs e)
        {
            ordenaItem(listMusicas, 'b', 1);
        }

        private void btnOrdenaMaisComercial_Click(object sender, EventArgs e)
        {
            ordenaItem(listComerciais, 'a', -1);
        }

        private void btnOrdenaMenosComercial_Click(object sender, EventArgs e)
        {
            ordenaItem(listComerciais, 'b', 1);
        }

        private void ordenaItem(ListBox list, char op, int indexAuxiliar)
        {
            int index = list.SelectedIndex;
            Object itemAtual = list.SelectedItem;

            bool condicao = false;

            switch (op)
            {
                case 'a':
                case 'A':
                    condicao = index > 0;
                    break;
                case 'b':
                case 'B':
                    condicao = index < (list.Items.Count - 1);
                    break;
            }

            if ((list.Items.Count > 1) && (condicao))
            {
                Object itemAuxiliar = list.Items[index + indexAuxiliar];
                list.Items[index] = itemAuxiliar;
                list.Items[index + indexAuxiliar] = itemAtual;
                list.SelectedIndex = index + indexAuxiliar;
            }
        }
        #endregion

        /*
        private void btnGrava_Click(object sender, EventArgs e)
        {
            saveFileDialog.DefaultExt = Gerador.Tipo;
            saveFileDialog.ShowDialog();
            String filePath = saveFileDialog.FileName;

            Hashtable arquivosDeMusicas =
                Gerador.geraMapDePastasEArquivos(getItemsDoListBox(listMusicas));
            Hashtable arquivosDeComerciais =
                Gerador.geraMapDePastasEArquivos(getItemsDoListBox(listComerciais));

            Gerador.geraArquivo(filePath, arquivosDeMusicas, arquivosDeComerciais);

            saveFileDialog.FileName = "";

        }*/

        private List<Pasta> getPastasDoListBox(ListBox list)
        {
            List<Pasta> listaConvertida = new List<Pasta>();

            foreach (Pasta pasta in list.Items)
            {
                listaConvertida.Add(pasta);
            }

            return listaConvertida;
        }

        private void btnGeraGrade_Click(object sender, EventArgs e)
        {
            FormGeraGrade form = new FormGeraGrade(
                getPastasDoListBox(listMusicas),
                getPastasDoListBox(listComerciais),
                this);
            form.MdiParent = this.MdiParent;
            form.WindowState = FormWindowState.Normal;
            form.Show();
            this.Enabled = false;
        }


    }
}
